import streamlit as st
import requests
import json

from utils.config import Config

config = Config('E:/Python+AI/group4_nlp_project')
# 页面配置
st.set_page_config(
    page_title="BERT 情感分析",
    page_icon="🤖",
    layout="centered"
)

# 读取类别映射
@st.cache_data
def load_categories():
    with open(config.class_path, 'r', encoding='utf-8') as f:
        categories = json.load(f)
    # 反转键值对，从id查找名称
    id_to_category = {v: k for k, v in categories.items()}
    return id_to_category

# 调用BERT API
def call_bert_api(text):
    try:
        response = requests.post(
            'http://127.0.0.1:5000/bert',
            json={'text': text},
            timeout=10
        )
        if response.status_code == 200:
            return response.json()
        else:
            st.error(f"API调用失败，状态码: {response.status_code}")
            return None
    except requests.exceptions.RequestException as e:
        st.error(f"请求异常: {e}")
        return None

# 主界面
def main():
    st.title("🤖 BERT 中文情感分析系统")
    st.markdown("---")

    # 侧边栏
    st.sidebar.header("关于")
    st.sidebar.info("""
    本系统基于BERT模型进行中文文本情感分析，
    可以识别文本所属的类别并判断情感倾向。
    
    **类别包括：**
    - 书籍、平板、手机、水果
    - 洗发水、热水器、蒙牛、衣服
    - 计算机、酒店
    """)

    st.sidebar.header("使用说明")
    st.sidebar.info("""
    1. 在下方输入框中输入要分析的中文文本
    2. 点击"分析情感"按钮
    3. 查看分析结果
    """)

    # 主要内容区域
    st.subheader("📝 输入文本")
    user_input = st.text_area(
        "请输入要分析的中文文本：",
        height=150,
        placeholder="书收到时书是被弄破了的"
    )

    # 加载类别映射
    try:
        categories = load_categories()
    except Exception as e:
        st.error(f"无法加载类别文件: {e}")
        return

    # 分析按钮
    if st.button("🔍 分析情感", use_container_width=True):
        if not user_input.strip():
            st.warning("请输入要分析的文本！")
        else:
            with st.spinner("正在分析中，请稍候..."):
                # 调用API
                result = call_bert_api(user_input)

                if result:
                    try:
                        # 解析结果
                        category = result['category']
                        label = result['label']

                        # 显示结果
                        st.subheader("📊 分析结果")
                        col1, col2 = st.columns(2)

                        with col1:
                            st.metric(
                                label="商品类别",
                                value=category
                            )

                        with col2:
                            sentiment_color = "green" if label == "好评" else "red"
                            st.metric(
                                label="情感倾向",
                                value=label,
                                delta="正面" if label == "好评" else "负面",
                                delta_color="normal" if label == "好评" else "inverse"
                            )

                        # 显示详细信息
                        st.subheader("📋 详细信息")
                        st.write(f"**输入文本：** {user_input}")
                        st.write(f"**预测类别：** {category}")
                        st.write(f"**情感分析：** <span style='color:{sentiment_color}'>{label}</span>", unsafe_allow_html=True)

                        # 添加情感指示器
                        st.progress(1.0 if label == "好评" else 0.0)

                    except Exception as e:
                        st.error(f"结果解析错误: {e}")
                else:
                    st.error("API调用失败，请检查后端服务是否正常运行！")

    # 示例文本
    st.subheader("💡 示例文本")
    example_texts = [
        "书收到时书是被弄破了的",
        "质量不怎么样。京东的东西越来越不行了,",
        "快递速度太慢了，服务态度也不好。"
    ]

    selected_example = st.selectbox("选择示例文本：", example_texts)

    if st.button("使用示例文本分析", use_container_width=True):
        if selected_example:
            with st.spinner("正在分析中，请稍候..."):
                # 调用API
                result = call_bert_api(selected_example)

                if result:
                    try:
                        # 解析结果
                        category = result['category']
                        label = result['label']

                        # 显示结果
                        st.subheader("📊 分析结果")
                        col1, col2 = st.columns(2)

                        with col1:
                            st.metric(
                                label="商品类别",
                                value=category
                            )

                        with col2:
                            sentiment_color = "green" if label == "好评" else "red"
                            st.metric(
                                label="情感倾向",
                                value=label,
                                delta="正面" if label == "好评" else "负面",
                                delta_color="normal" if label == "好评" else "inverse"
                            )

                        # 显示详细信息
                        st.subheader("📋 详细信息")
                        st.write(f"**输入文本：** {selected_example}")
                        st.write(f"**预测类别：** {category}")
                        st.write(f"**情感分析：** <span style='color:{sentiment_color}'>{label}</span>", unsafe_allow_html=True)

                    except Exception as e:
                        st.error(f"结果解析错误: {e}")
                else:
                    st.error("API调用失败，请检查后端服务是否正常运行！")

if __name__ == "__main__":
    main()
